package com.cnc.tag;

import javax.servlet.jsp.JspException;
import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * 调用 spring service bean 方法， List list = service.method(String param); 把返回的
 * list 放入request 中，以供powerweb中需要dataList的标签使用，也可为下拉列表使用<br>
 * Example: <custom:datalist method="getAccountTypes" service="tfmCommService"></custom:datalist>
 */
public class DataListSourceTag extends LtcmTag {
	/**
	 * list 在request中存放的名称 ，以让其他标签能引用。
	 */
	private String var = "dataList";

	/**
	 * spring service bean 配置名
	 */
	private String service;

	/**
	 * bean 中的一个方法名，
	 */
	private String method;

	/**
	 * 方法的参数，如果有必须为 String
	 */
	private String param = null;

	/**
	 * var 的作用域(page,request,session,application)，
	 * 默认page(不支持application,不推荐session)
	 */
	private String scope = "page";

	public String getVar() {
		return var;
	}

	public void setVar(String var) {
		this.var = var;
	}

	public String getService() {
		return service;
	}

	public void setService(String service) {
		this.service = service;
	}

	public String getMethod() {
		return method;
	}

	public void setMethod(String method) {
		this.method = method;
	}

	public String getParam() {
		return param;
	}

	public void setParam(String param) {
		this.param = param;
	}

	public String getScope() {
		return scope;
	}

	public void setScope(String scope) {
		this.scope = scope;
	}

	public int doEndTag() throws JspException {
		Object bean = this.getBean(service);
		Method theMethod;
		Object dataList = new ArrayList();
		try {
			if (param != null) { 
//				 如果传递的参数是个变量，则使用变量，否则直接使用传入的值。
				Object po = pageContext.findAttribute(param);
				if (po != null && po instanceof String) {
					param = (String) po;
				}
				theMethod = bean.getClass().getMethod(method, new Class[] { String.class });
				dataList = theMethod.invoke(bean, new Object[] { param });
			} else {
				theMethod = bean.getClass().getMethod(method, null);
				dataList = theMethod.invoke(bean, null);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		if ("page".equalsIgnoreCase(scope)) {
			this.pageContext.setAttribute(var, dataList);
		} else if ("session".equalsIgnoreCase(scope)) {
			this.pageContext.getSession().setAttribute(var, dataList);
		} else {
			this.pageContext.getRequest().setAttribute(var, dataList);
		}
		var = "dataList";
		param = null;
		scope = "page";
		return (EVAL_PAGE);
	}
}
